#include "evento/gerenciador.h"

#include "evento/evento.h"
#include "evento/tratador.h"
#include "tarefa/gerenciador.h"

#include <boost/scoped_ptr.hpp>
#include <map>
#include <utility>

using namespace boost;
using namespace std;

namespace evento {

gerenciador::gerenciador() {
  GT.cadastra(this);
}

iterator gerenciador::cadastra(en_evento tipo, tratador* trat) {
  return mapa_.insert(make_pair(tipo, trat));
}

bool gerenciador::executa(int passou) {
    if (fila_.empty())
    return true;
  evento* event = fila_.front(); fila_.pop();
  map<en_evento, tratador*>::iterator it;
  it = mapa_.find(event->tipo());
  for (;it != mapa_.end() && it->first == event->tipo(); it++)
    it->second->invoca(*event, passou);
  delete event;
  return true;
}

gerenciador::~gerenciador() {
  map<en_evento, tratador*>::iterator it;
  for (it = mapa_.begin() ; it != mapa_.end() ; it++ ) {
    if ( it->second->deleta_ )
      delete it->second;
  }
}

iterator gerenciador::get(en_evento tipo) {
  map<en_evento, tratador*>::iterator it;
  return mapa_.find(tipo);
}

void gerenciador::remove(iterator it) {
  if (it->second->deleta_)
    delete it->second;
  mapa_.erase(it);
}

void gerenciador::lanca_evento(evento* event) {
  fila_.push(event);
}

}
